import { CartItem } from "@/types/cart";
import { ApiRes } from "@/types/data";
import request from "@/utils/request";
import { defineStore } from "pinia";
import user from './user'
const useCartStore = defineStore('cart', {
  // 状态
  state() {
    return {
      list: [] as CartItem[]   // 购物车数组
    }
  },
   // 持久化
   persist: {
    enabled: true,
    strategies: [{key:'abc'}]
  },
  // 计算
  getters: {
    // 判断是否登录
    isLogin(): boolean{
      const userInfo = user()
      return Boolean(userInfo.profile.token)
    },
    // 计算有效的商品
    effectiveList() :  CartItem[]{
      return this.list.filter((it:CartItem) =>it.isEffective)
    },
    // 商品的数量
    effectiveListCounts() : number{
      return this.effectiveList.reduce((acc:number,cur:CartItem)=>{
        return acc + cur.count
      },0)
    },
    // 以选择的商品总价
    selectedListPrice(): number {
      return this.selectedList.reduce((sum, item) => sum + item.count* +item.nowPrice, 0)
    },
    selectedList() :CartItem[]{
      return this.effectiveList.filter(it => it.selected)
    },
    selectedNum() :number{
      return this.selectedList.reduce((acc,cur)=>{
        return acc + cur.count
      },0)
    },
    // 商品的价格
    effectiveListPrice() : number{
      return this.effectiveList.reduce((acc:number,cur:CartItem)=>{
        return acc + Number(cur.price)*cur.count
      },0)
    },
     // 是否全部选中
     isSelectedAll(): boolean {
      return this.effectiveList.every(item => item.selected)
    },
  },
  // 方法
  actions: {
// 合并购物车
    async mergeLocalCart() {
      const data = this.list.map(({ skuId, selected, count }) => ({
        skuId,
        selected,
        count
      }))
      await request.post('/member/cart/merge', data)
      // 合并成功，重新获取购物车列表
      this.getCartList()
    },

    // 清空购物车
    clearCart(){
      this.list = []
    },
    // 修改全选或者全不选
    async updateCartAllSelected(isSelected: boolean) {
      await request.put('/member/cart/selected', {
        selected: isSelected,
      })
      // 获取购物车列表
      this.getCartList()
    },
      // 修改购物车商品: 修改选中状态 + 数量
      async updateCart(
      skuId: string,
      data: { selected?: boolean; count?: number }
    ) {
      if(this.isLogin){
        await request.put(`/member/cart/${skuId}`, data)
        // 重新获取最新购物车列表
        this.getCartList()
      } else {
        // 本地修改,找到这个商品,修改对应的属性
        const g = this.effectiveList.find(it => it.skuId === skuId)
        if(!g){return}
        // 如果当前改的是 是否选中
        if(data.selected !==undefined){
          g.selected = data.selected
        }
        if(data.count !== undefined){
          g.count = data.count
        }
      }
    },
        // 删除购物车商品
    async delCart(skuIds: string[]) {
      if(this.isLogin) {
        await request.delete('/member/cart', {
          data: { ids: skuIds }
          // 重新获取最新购物车列表`
        })
        this.getCartList()
      }else {
          this.list = this.list.filter((it)=>{
          return  skuIds.includes(it.skuId) === false
        })
      }
    },
    // 获取购物车列表
    async getCartList() {
      if(this.isLogin){
        const res = await request.get<ApiRes<CartItem[]>>('/member/cart')
        this.list = res.data.result
      }else{
        // 没有登录
          // 遍历发送请求, 校验更新sku商品的库存和价格, 是否有效
      this.list.forEach(async (cartItem) => {
        const { skuId } = cartItem
        // 根据 skuId 获取最新商品信息
        const res = await request.get<ApiRes<CartItem>>(
          `/goods/stock/${skuId}`
        )
        // 保存最新商品信息
        const lastCartInfo = res.data.result
        // 更新商品现价
        cartItem.nowPrice = lastCartInfo.nowPrice
        // 更新商品库存
        cartItem.stock = lastCartInfo.stock
        // 更新商品是否有效
        cartItem.isEffective = lastCartInfo.isEffective
      })
      }
    },
    // 加入购物车
    async addCart(data: CartItem) {
      if(this.isLogin){
        await request.post('/member/cart', data)
        // 加入购物车后,重新获取数据
        this.getCartList()
      }else{
        const goods = this.list.find((item)=>item.skuId==data.skuId)
        if(goods){
          goods.count += data.count
        }else{
          this.list.push(data)
        }
      }
    }
  },
});

export default useCartStore;